/**
 * 提供通用唯一识别码工具类
 */
export class IdUtils {

    /**
     * 随机生成32位uuid
     * @returns 32位uuid
     */
    static randomUUID() {
        return (IdUtils.S4() + IdUtils.S4() + IdUtils.S4() + IdUtils.S4() + IdUtils.S4() + IdUtils.S4() + IdUtils.S4() + IdUtils.S4());
    }

    /**
     * 随机生成36位uuid
     * @returns 36位uuid
     */
    static uuid() {
        let s = [] as any;
        let hexDigits = "0123456789abcdefghijklmnopqrstuvwxyz";
        for (let i = 0; i < 36; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010 
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01 
        s[8] = s[13] = s[18] = s[23] = "-";

        let uuid = s.join("");
        return uuid;
    }

    /**
     * 随机生成guid
     * @returns 36位guid
     */
    static guid() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    }

    /**
     * 随机生成guid
     * @returns 36位guid
     */
    static guid2() {
        return (IdUtils.S4() + IdUtils.S4() + "-" + IdUtils.S4() + "-" + IdUtils.S4() + "-" + IdUtils.S4() + "-" + IdUtils.S4() + IdUtils.S4() + IdUtils.S4());
    }

    /**
     * 随机生成4位字符
     * @returns 4位码
     */
    static S4() {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }
}
